<?php
require_once(MODULESPATH . "core/b.object.class.php");
require_once(MODULESPATH . "accounts/business/b.accounts.inc.php");

/**
 * 账户业务层用户类。
 */
class BPreference extends BObject implements IBPreference{
    /**
     * 用户首选项数据库访问对象。
     */
    private $dao = null;
    
    /*- IBPreference 接口实现 START -*/
    /*- IInjectEnable 接口实现 START -*/
    /**
     * 设置属性值。
     */
    public function __set($prop, $val){
        $this->$prop = $val;
    }
    /*- IInjectEnable 接口实现 END -*/
    
    /**
     * 设置用户的首先项。
     * @param Int $userId 系统用户ID。
     * @param String $key 首选项的键。
     * @param String $val 首选项的值。
     * @param String $type 用户首选项的类型。
     * @return 是否设置成功。
     */
    public function setPreference($userId, $key, $val, $type){
        $result = 0;
        if(($userId > 0) && (strlen($key) > 0) && (strlen($type) > 0)){
            $result = $this->dao->setPreference($userId, $key, $val, $type);
            if($result){
                $key = $this->getCacheKey($userId, $type);
                $preferences = $this->dao->getPreferences($userId, $type);
                $this->cache->replace($key, $preferences);
            }
        }
        return $result;
    }
    
    /**
     * 获取用户的首选项列表。
     * @param Int $userId 系统用户ID。
     * @param String $type 用户首选项的类型。
     * @return Array 首选项列表。
     */
    public function getPreferences($userId, $type){
        $result = array();
        $globalPreferences = array();
        if(($userId > 0) && (strlen($type) > 0)){
            if(PreferenceType::ALLPREFERENCE == $type){
                $type = PreferenceType::PRIVATEPREFERENCE;
                $globalPreferences = $this->getSpecificPreferences(-1, PreferenceType::PUBLICPREFERENCE);
            }
            $result = $this->getSpecificPreferences($userId, $type);
            $result = $this->merge($globalPreferences, $result);
        }
        return $result;
    }
    /*- IAdjustUserData 接口实现 START -*/
    /**
     * 更换数据的用户ID。
     * @param Int $oldId 用户旧ID。
     * @param Int $newId 用户新ID。
     * @return 是否操作成功。
     */
    public function replaceByUid($oldId, $newId){
        return $this->dao->replaceByUid($oldId, $newId);
    }
    
    /**
     * 根据用户ID删除数据。
     * @param Int $uid 用户ID。
     * @return 是否操作成功。
     */
    public function deleteByUid($uid){
        return $this->dao->deleteByUid($oldId, $newId);
    }
    /*- IAdjustUserData 接口实现 END -*/
    /*- IBPreference 接口实现 END -*/
    
    /**
     * 先从缓存机制中，然后从数据库中，获取用户的首选项列表。
     * @param Int $userId 系统用户ID。
     * @param String $type 用户首选项的类型。
     * @return Array 首选项列表。
     */
    private function getSpecificPreferences($userId, $type){
        $result = array();
        $key = $this->getCacheKey($userId, $type);
        $result = $this->cache->get($key);
        if(null == $result){
            $result = $this->dao->getPreferences($userId, $type);
            $this->cache->add($key, $result);
        }
        return $result;
    }
    
    /**
     * 获取缓存机制中使用的键。
     * @param Int $userId 系统用户ID。
     * @param String $type 用户首选项的类型。
     * @return String 缓存机制中使用的键。。
     */
    private function getCacheKey($userId, $type){
        return "accounts_user_preferences_$type$userId";
    }
}
?>
